#include <stdio.h>

int main()
{
/*语句*/
    /*条件分支语句：
        if(表达式)  //如果表达式成立 执行大括号中的语句
        {

        }
        else if()
        {

        }
        else
        {
            
        }
        大括号括起来表示作用域*/
#if 0
        int a = 1;
        if(a == 1)
        {
            int b = 2;
            printf("a=1\n");
        }
        b++;    //在上面大括号里定义的变量只能在那个作用域里使用
#endif

#if 1
        int a = 2;
        if(a = 0)   //先把0赋给a，再判断真假（注意这里是"="不是"=="），相当于a = 0;if(),真就进入if
        {
            printf("a=2\n");
        }
        printf("a = %d\n",a);   //经过判断后出来的值就变了
#endif

#if 0
        int a = 2;
        if(a = 1);  //加了分号，说明这句话到这就结束了,此时a已经被重新赋值了   
        {
            printf("a=2\n");
        }
        printf("a = %d\n",a);   
#endif

#if 0
        int a = 1;
        if(a == 1)  //if不加大括号的时候，它的作用范围是一行
        printf("成立！\n");
#endif

#if 0
        int a = 1;
        int b = 2;
        if(a == 1)
            if(b == 3)
                printf("成立！\n"); //不打印，只打印下面的hello world
                printf("hello world\n"); 
#endif

#if 0
        int a = 1;
        int b = 2;
        //一行只写一条指令
        if(a == 1)  //作用范围是一行
            printf("hello world\n"); printf("成立！\n");
#endif

        /*多分支结构：switch case*/
#if 0
            int a = 1;
            switch (a)  
            {
                case 1: //a == 1成立
                {
                    printf("a = 1\n");
                }

                case 2:
                {
                    printf("a = 2\n");
                }
            }
            //打印两个 
            //区别于if else语句，switch case语句的分支并不是互斥的，它会找到第一个成立的分支，然后执行下面所有的的逻辑代码
#endif

#if 0
            //为了解决上述问题，会在case分支的结尾加个break
            int a = 10;
            switch (a)  
            {
                case 1: //a == 1成立
                {
                    printf("a = 1\n");
                }
                break;  //分支结束
                case 2:
                {
                    printf("a = 2\n");
                }
                break;

                default:    //以上条件均不成立 执行这条默认结果分支
                    printf("默认分支\n");
                    break;
            }
#endif

#if 0
            //char类型也可以（char是整型）
            char a = '1';
            switch (a)  
            {
                case '1':   //case 49: 也可以 
                {
                    printf("a = 1\n");
                }
                break;  
                case '2':
                {
                    printf("a = 2\n");
                }
                break;

                default:    
                    printf("默认分支\n");
                    break;
            }
#endif

#if 0
            //switch case的表达式判断只能放整型
            float a = 1;
            switch (a)  //浮点型不可以判断相等 
            {
                case 1: //a == 1成立
                {
                    printf("a = 1\n");
                }
                break;  
                case 2:
                {
                    printf("a = 2\n");
                }
                break;

                default:    
                    printf("默认分支\n");
                    break;
            }
#endif

    /*循环语句：*/
        /*for循环*/
#if 0
            //初始条件；循环条件；步长
            for(int i = 1; i <= 100; i++)
            //循环体：重复执行的代码体
            {
                printf("%d ",i);
            }
            printf("\n");
#endif

            //打印所有的偶数
#if 0
            for(int i = 1; i <= 100; i++)
            {
                if(i % 2 == 0)
                {
                    printf("%d ",i);
                }
            }
            printf("\n");
#endif

#if 0
            for(int i = 1; i <= 100; i++)
            {
                if((i & 1) == 0)    //一个数&1是0，那么它一定是偶数（因为1的二进制除了最低为是1，前面都是0，若一个数是偶数，那么它最低为一定是0，所以相与一定是0）
                {
                    printf("%d ",i);
                }
            }
            printf("\n");
#endif

#if 0
            for(int i = 2; i <= 100; i += 2)
            {
                printf("%d ",i);
            }
            printf("\n");

            //以上三种写法，这种更好，因为循环次数少
#endif

#if 0
            int i = 2;
            for(;;i += 2)   //死循环：无法达到循环的终止条件，导致的无限循环
            {
                printf("%d ",i);
            }
            printf("\n");
#endif

#if 0
            int i = 2;
            for(;;i += 2)   
            {
                printf("%d ",i);
                if(i >= 100)
                    break;  //跳出循环
            }
            printf("\n");
#endif

#if 0
            //也不要打印3的倍数
            int i = 2;
            for(;;i += 2)
            {
                if(i % 3 == 0)
                    continue;   //结束当次循环，继续到下一次循环（区别于break,break是直接跳出整个循环）
                printf("%d ",i);
                if(i >= 100)
                    break;  //跳出循环
            }
            printf("\n");
            
#endif
            
#if 0 
            //全部写在循环体里面也可以(只要循环具备终止条件就可以，循环体里一定要有break)
            int i = 2;
            for(;;)
            {
                i += 2; //i的变化一定要放在continue之前
                if(i % 3 == 0)
                    continue;   //结束当次循环，继续到下一次循环（区别于break,break是直接跳出整个循环）
                printf("%d ",i);
                if(i >= 100)
                    break;  //跳出循环
            }
            printf("\n");
#endif

#if 0
            //for循环至少执行0次
            int i = -1; //初始条件一开始就不符合循环条件，不进入循环体（while循环也是如此）
            for(; i <= 0; i++)
            {
                printf("%d\n",i);
            }
#endif

#if 0
            for(int i = 0; i < 100; i++);   //可以理解为for(){};不是死循环
            {
                printf("%d\n",++i);         //不会打印，而且会报错，因为这个i不在这个作用域内，找不到
                printf("hello world\n");    //会打印一次
            }
#endif

#if 0

            for(int i = 1; i <= 100; i++)   //和if循环一样，不带大括号作用范围也是一行
                if(i % 2 == 0)  //作用域也是一行
                    printf("%d\n",i);   //可以打印
                else                    //这个else和if是一起的，所以下面也能生效
                    printf("%d\n",i);   //可以打印
#endif

        /*while循环*/
            //括号中的表达式成立，循环
#if 0
            int i = 1;
            while(i <= 100)
            {
                printf("%d\n",i);
                i++;    //while循环注意步长条件不能少
                //printf("%d\n",i++);   //也可以写在里面
            }
#endif

#if 0
            int i = 1;
            while(1)    //1表示永真，即永远成立（while的死循环写法）
            {
                printf("%d\n",++i);
            }
#endif

#if 0
            int i = 1;
            while(i <= 100);    //死循环（while循环括号里不自带步长）
            {
                printf("%d\n",i);
            }
#endif

#if 0
            int i = 1;
            while(i = 100)  //把100赋给i，然后判断i是否为0，如果是0那就是假，不是0那就是真
            {
                printf("%d\n",i);
                i++;
            }
            //会一直打印100，因为每次i++完到while循环又会被重新赋值为100
#endif

        /*do...while循环*/
#if 0
            int i = 1;
            do
            {
                printf("%d\n",++i);
            } while (i >= 100); //do在上面，所以此循环至少执行一次
#endif      



    return 0;
}